#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
using namespace std;
void handler(int sig)
{
    if(sig==SIGCHLD)
    {
        while(1)
        {//-1表示等待任意子进程
            pid_t rid=waitpid(-1,nullptr,WNOHANG);
            if(rid>0)
            {
                cout<<"wait child success"<<endl;
            }
            else if(rid<=0)
            {
                break;
            }
            cout<<"wait sub process done"<<endl;
        }
    }
}
int main()
{
    signal(SIGCHLD,SIG_IGN);
    for(int i=0;i<100;i++)
    {
        pid_t id=fork();
        if(id==0)
        {
            if(getpid()%2)sleep(100);
            else exit(0);
        }
    }
while(1);

    return 0;
}
// volatile int g_flag=0;
// void handler(int sig)
// {
//     cout<<"g_flag 0 -> 1"<<endl;
//     g_flag=1;
// }
// int main()
// {
//     signal(2,handler);
//     while(!g_flag);
//     cout<<"process quit success"<<endl;
//     return 0;
// }
// #include<stdio.h>
// #include<signal.h>
// int g_flag=0;
// void handler(int sig)
// {
//     printf("g_flag 0 -> 1\n");
//     g_flag=1;
// }
// int main()
// {
//     signal(2,handler);
//     while(!g_flag);
// printf("process quit success\n");
// }


//     return 0;
// }
// void printpending(sigset_t &pending)
// {
//     for (int i = 31; i > 0; i--)
//     {
//         if (sigismember(&pending, i))
//             cout << "1";
//         else
//             cout << "0";
//     }
//     cout << endl;
// }
// void handler(int sig)
// {
//     cout << "signal: " << sig << endl;
//     sigset_t pending;
//     sigemptyset(&pending);

//     while (1)
//     {
//         sigpending(&pending);
//         printpending(pending);
//     }
// }
// int main()
// {
//     struct sigaction act, oact;
//     act.sa_handler = handler;
//     act.sa_flags = 0;
//     sigemptyset(&act.sa_mask);
//     sigaction(2, &act, &oact);
//     while (1)
//         sleep(1);

//     return 0;
// }

// void printpending(sigset_t &pending)
// {
//     for (int i = 31; i > 0; i--)
//     {
//         if (sigismember(&pending, i))
//             cout << "1";
//         else
//             cout << "0";
//     }
//     cout << endl;
// }
// void handler(int sig)
// {
//     cout << sig << " signal begin deal"<<endl;;
//     sigset_t s;
//     sigemptyset(&s);
//     sigpending(&s);
//     printpending(s);
//     cout << sig << " signal end deal"<<endl;;
// }
// int main()
// {
//     signal(2, handler);
//     while (1)
//         ;
//     return 0;
// }

// int main()
// {
//     cout<<"pid: "<<getpid()<<endl;
//     sigset_t s;
//     sigemptyset(&s);

//     for (int i = 1; i < 32; i++)
//     {
//         sigaddset(&s, i);
//     }
//     sigprocmask(SIG_SETMASK, &s, nullptr);//全部信号都阻塞
//     sigset_t pending;
//     sigemptyset(&pending);

//     while (1)
//     {
//         sigpending(&pending);
//         printpending(pending);
//         sleep(1);
//     }

//     return 0;
// }
// void handler(int sig)
// {
//     cout<<"pid: "<<getpid()<<" receive "<<sig<<" signal "<<endl;
// }
// int main()
// {
//     signal(2,handler);
//     cout << "pid: " << getpid() << endl;
//     sigset_t block, old_block;
//     sigemptyset(&block);
//     sigemptyset(&old_block);
//     sigaddset(&block, 2);
//     sigprocmask(SIG_SETMASK, &block, &old_block);
//     cout << "block 2 signal success" << endl;
//     sigset_t pending;
//     sigemptyset(&pending);
//     int cnt = 5;
//     while (cnt--)
//     {
//         sigpending(&pending);
//         printpending(pending);
//         sleep(1);
//     }
//     sigprocmask(SIG_UNBLOCK, &block, &old_block);
//     cout << "unblock 2 signal success" << endl;
//     cnt = 5;
//     while (cnt--)
//     {
//         sigpending(&pending);
//         printpending(pending);
//         sleep(1);
//     }
//     return 0;
// }

// int main()
// {
//     sigset_t s;
//     sigemptyset(&s);//将s的各个位变成0
//     sigfillset(&s);//将s的各个位变成1
//     sigaddset(&s, 2);//将s的第二位变成1
//     sigdelset(&s, 2);//将s的第二位变成0
//     sigismember(&s, 2);//判断s的第二位是否为1，为1返回1，为0返回0

//     return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if (id == 0)
//     {
//         int a = 10;
//         a /= 0;
//     }
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     if (rid>0)
//     {
//         cout << "exit code is: " << ((status >> 8) & (0xff)) << endl;
//         cout << "exit signal is " << (status & (0x7f)) << endl;
//         cout << "core dump is " << ((status >> 7) & 0x1) << endl;
//     }
//     return 0;
// }

// int main()
// {
//     int a=10;
//     a/=0;

//     return 0;
// }